package com.gqs.bookstore.dao.impl;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.gqs.bookstore.dao.BaseDao;
import com.gqs.bookstore.dao.CatalogDao;
import com.gqs.bookstore.vo.Catalog;

public class CatalogDaoImpl extends BaseDao implements CatalogDao {
	/**
	 * 获取自动增长因子并且插入数据
	 */
	@Override
	public Catalog save(final Catalog catalog) throws SQLException {
		String sql="insert into catalogs(name,status,update_at,create_at) values(?,?,?,?)";
		Object[] params ={catalog.getName(),catalog.getStatus(),
						  catalog.getUpdateAt(),catalog.getCreateAt()};
		Long id =super.GetGenerateIncreaseId(sql, params);
		catalog.setId(id);//将获取到的id通过set方法给Id赋值【值拆箱转换id.intValueof[将long类型的id转换成id类型的]
		super.closeConnection();
		return catalog;//这里返回的catalog带有主键了
	}
	/**
	 * 按主键查找[单查]
	 * 要将从数据库里查找到的数据set到catalog的实体类中，包装构成一个catalog对象,然后根据需要在前台get展现出来
	 * 即查找成功后返回一个catalog对象
	 */
	@Override
	public Catalog findById(Long id) throws SQLException {
		Catalog catalog = null;
		String sql="select * from catalogs where id=?";//注意这里*的效率在实际应用中不常用，效率不高
		Object[] params = {id};
		List<Map<String, Object>> list = super.executeQuery(sql, params);
		if(list.size()!=0){
			//这里是按id查找的，只能返回一条记录[也就是说list里只有一个map(一个catalog对象)]
			Map<String, Object> record1 = list.get(0);//返回到第一个map,即第一行数据【list下标从0开始】
			if(record1!=null){
				catalog = new Catalog();
				//record1.get(Object key)这里的key是要和数据库里的字段名要一致
				catalog.setId( (Long) record1.get("id"));//record1.get()方法返回的是一个对象，要进行强转
				catalog.setName((String) record1.get("name"));
				catalog.setStatus((Integer) record1.get("status"));
				catalog.setUpdateAt((Date) record1.get("update_at"));
				catalog.setCreateAt((Date) record1.get("create_at"));
			}
		}
		super.closeConnection();
		return catalog;
	}

	//仔细研究这其中的算法
	@Override
	public List<Catalog> findAll() throws SQLException {
		List<Catalog> lists = null;//必须在这个方法体内定义成全局的，不能定义在64行，要返回用
		String sql = "select * from catalogs";
		Object[] params = {};
		List<Map<String, Object>> list = super.executeQuery(sql, params);
		if(list.size()!=0){//也可以用if(!list.isEmpty())
			//当list.size()!=0时才创建List<Catalog>对象符合逻辑
			lists=new ArrayList<Catalog>();//不能放在while里，不然每次循环都要重新去new,这样后面会将前面覆盖掉
			Iterator<Map<String, Object>> it = list.iterator();//遍历map的方法
			while(it.hasNext()){//这里是执行多次循环的开始
				Map<String, Object> record = it.next();
				Catalog catalog = null;
				if(record != null){
					catalog = new Catalog();
					catalog.setId((Long) record.get("id"));
					catalog.setName((String) record.get("name"));
					catalog.setStatus((Integer) record.get("status"));
					catalog.setUpdateAt((Date) record.get("update_at"));
					catalog.setCreateAt((Date) record.get("create_at"));
					lists.add(catalog);
				}
			}
		}
		super.closeConnection();
		return lists;
	}
	/**
	 * 增加数据和修改数据-----这里都是以catalog对象为一个中间媒介
	 * 是先将要存的数据先存到catalog对象里[可以通过参数传或者通过set进到]，然后再将数据从catalog对象里get出来insert到数据库里
	 * @throws SQLException 
	 */
	@Override
	public void save_only(Catalog catalog) throws SQLException {
		String sql = "insert into catalogs(name,status,update_at,create_at) values(?,?,?,?)";
		Object[] params = {catalog.getName(),catalog.getStatus(),
						   catalog.getUpdateAt(),catalog.getCreateAt()};
		super.executeUpdate(sql, params);
		super.closeConnection();
	}
	@Override
	public void modify(Catalog catalog) throws SQLException {
		if(catalog == null){
			return;
		}
		String sql= "update catalogs set name=?,status=?,update_at=? where id =?";
		Object[] params = {catalog.getName(),catalog.getStatus(),
						   catalog.getUpdateAt(),catalog.getId()};
		super.executeUpdate(sql, params);
		super.closeConnection();
	}
	@Override
	public void delete(Long id) throws SQLException {
		if(id == null){
			return;
		}
		String sql= "delete from catalogs where id =?";
		Object[] params={id};
		super.executeUpdate(sql, params);
		super.closeConnection();
	}
	@Override
	public void changeStatus(Long id, Integer status, Date updateAt) throws SQLException {
		String sql = "update catalogs set status=? , update_at =? where id=?";
		Object[] params = {status,updateAt,id};
		super.executeUpdate(sql, params);
		super.closeConnection();
	}
	
}
